#include "Asteroid.h"

Asteroid::Asteroid(){}

Asteroid::Asteroid(int tipo, Tamanho tamanho, float xAst, float yAst, float angulo, int id){
    
    this->setTipo(tipo);
    this->setTamanho(tamanho);
    this->setX(xAst);
    this->setY(yAst);
    this->setAngulo(angulo);
    this->setAtivo(true);
    this->setId(id);

    switch(tamanho){
        case PEQUENO:
            this->setDivisoes(0);
            this->setRaio(2);
            this->setVelocidade(0.2);
            break;

        case MEDIO:
            this->setDivisoes(3);
            this->setRaio(4);
            this->setVelocidade(0.15);
            break;

        case GRANDE:
            this->setDivisoes(2);
            this->setRaio(8);
            this->setVelocidade(0.09);
            break;
    }
}

//////////////////////////////////////////////////////////////////////////
/********************** GETTERS E SETTERS *******************************/

void Asteroid::setTipo(int tipo){
    this->tipo = tipo;
}

void Asteroid::setTamanho(Tamanho tamanho){
    this->tamanho = tamanho;
}

void Asteroid::setDivisoes(int divisoes){
    this->divisoes = divisoes;
}

int Asteroid::getTipo(){
    return this->tipo;
}

Tamanho Asteroid::getTamanho(){
    return this->tamanho;
}

int Asteroid::getDivisoes(){
    return this->divisoes;
}

void Asteroid::setId(int id) {
    this->id = id;
}

int Asteroid::getId() {
    return id;
}

//////////////////////////////////////////////////////////////////////////


void Asteroid::diminuirTamanho() {
    
    
    switch(this->tamanho){
        case PEQUENO:
	    this->setAtivo(false);
            break;

        case MEDIO:
            this->setTamanho(PEQUENO);
            this->setDivisoes(0);
            this->setRaio(2);
            this->setVelocidade(0.2);

            break;

        case GRANDE:
            this->setTamanho(MEDIO);
            this->setDivisoes(3);
            this->setRaio(4);
            this->setVelocidade(0.15);
	    
	    break;
    }
}


void Asteroid::desenhar(){

    if (this->isAtivo()) {

        glPushMatrix();

        glTranslatef(this->getX(), this->getY(), 0.0);

	    glColor3f(0,0,1);
        switch(this->getTipo()){
	    
	    case 1:
		//glColor3f(GRAY);
		glBegin(GL_POLYGON);
		glVertex3f(-0.5 * this->getRaio(), 2.0 * this->getRaio(), 0.0);
		glVertex3f(0.5 * this->getRaio(), 2.0 * this->getRaio(), 0.0);
		glVertex3f(0.8 * this->getRaio(), 0.7 * this->getRaio(), 0.0);
		glVertex3f(2.1 * this->getRaio(), 0.2 * this->getRaio(), 0.0);
		glVertex3f(1.9 * this->getRaio(), -1.2 * this->getRaio(), 0.0);
		glVertex3f(0.5 * this->getRaio(), -2.0 * this->getRaio(), 0.0);
		glVertex3f(-0.9 * this->getRaio(), -2.0 * this->getRaio(), 0.0);
		glVertex3f(-2.2 * this->getRaio(), -0.3 * this->getRaio(), 0.0);
		glVertex3f(-2.1 * this->getRaio(), 0.7 * this->getRaio(), 0.0);
		glVertex3f(-0.8 * this->getRaio(), 0.7 * this->getRaio(), 0.0);
		glVertex3f(-0.5 * this->getRaio(), 2.0 * this->getRaio(), 0.0);
		glEnd();

		break;

	    case 2:
		//glColor3f(GRAY);
		glBegin(GL_POLYGON);
		glVertex3f(-0.5 * this->getRaio(), 2.1 * this->getRaio(), 0.0);
		glVertex3f(1.0 * this->getRaio(), 2.1 * this->getRaio(), 0.0);
		glVertex3f(0.3 * this->getRaio(), 1.0 * this->getRaio(), 0.0);
		glVertex3f(1.9 * this->getRaio(), 1.0 * this->getRaio(), 0.0);
		glVertex3f(2.1 * this->getRaio(), -1.0 * this->getRaio(), 0.0);
		glVertex3f(0.2 * this->getRaio(), -1.3 * this->getRaio(), 0.0);
		glVertex3f(0.3 * this->getRaio(), -2.1 * this->getRaio(), 0.0);
		glVertex3f(-1.3 * this->getRaio(), -1.9 * this->getRaio(), 0.0);
		glVertex3f(-1.3 * this->getRaio(), -1.0 * this->getRaio(), 0.0);
		glVertex3f(-2.1 * this->getRaio(), -0.8 * this->getRaio(), 0.0);
		glVertex3f(-1.6 * this->getRaio(), 1.0 * this->getRaio(), 0.0);
		glVertex3f(-0.8 * this->getRaio(), 1.0 * this->getRaio(), 0.0);
		glVertex3f(-0.5 * this->getRaio(), 2.1 * this->getRaio(), 0.0);
		glEnd();

		break;

	    case 3:
		//glColor3f(GRAY);
		glBegin(GL_POLYGON);
		glVertex3f(-1.3 * this->getRaio(), 2.1 * this->getRaio(), 0.0);
		glVertex3f(0.1 * this->getRaio(), 2.1 * this->getRaio(), 0.0);
		glVertex3f(1.7 * this->getRaio(), 1.3 * this->getRaio(), 0.0);
		glVertex3f(1.7 * this->getRaio(), 0.8 * this->getRaio(), 0.0);
		glVertex3f(0.4 * this->getRaio(), 0.0 * this->getRaio(), 0.0);
		glVertex3f(2.0 * this->getRaio(), -0.8 * this->getRaio(), 0.0);
		glVertex3f(0.9 * this->getRaio(), -1.9 * this->getRaio(), 0.0);
		glVertex3f(0.1 * this->getRaio(), -1.4 * this->getRaio(), 0.0);
		glVertex3f(-0.1 * this->getRaio(), -2.1 * this->getRaio(), 0.0);
		glVertex3f(-2.0 * this->getRaio(), -0.3 * this->getRaio(), 0.0);
		glVertex3f(-2.0 * this->getRaio(), 1.0 * this->getRaio(), 0.0);
		glVertex3f(-0.3 * this->getRaio(), 1.0 * this->getRaio(), 0.0);
		glVertex3f(-1.3 * this->getRaio(), 2.1 * this->getRaio(), 0.0);
		glEnd();

		break;

	    case 4:
		//glColor3f(GRAY);
		glBegin(GL_POLYGON);
		glVertex3f(-2.0 * this->getRaio(), 0.3 * this->getRaio(), 0.0);
		glVertex3f(-0.4 * this->getRaio(), 2.0 * this->getRaio(), 0.0);
		glVertex3f(0.7 * this->getRaio(), 2.0 * this->getRaio(), 0.0);
		glVertex3f(2.0 * this->getRaio(), 0.4 * this->getRaio(), 0.0);
		glVertex3f(2.0 * this->getRaio(), -0.2 * this->getRaio(), 0.0);
		glVertex3f(0.1 * this->getRaio(), -2.0 * this->getRaio(), 0.0);
		glVertex3f(-0.7 * this->getRaio(), -2.0 * this->getRaio(), 0.0);
		glVertex3f(-0.2 * this->getRaio(), 0.0 * this->getRaio(), 0.0);
		glVertex3f(-1.2 * this->getRaio(), -2.0 * this->getRaio(), 0.0);
		glVertex3f(-2.0 * this->getRaio(), -0.6 * this->getRaio(), 0.0);
		glVertex3f(-0.9 * this->getRaio(), 0.1 * this->getRaio(), 0.0);
		glVertex3f(-2.0 * this->getRaio(), 0.3 * this->getRaio(), 0.0);
		glEnd();

		break;
        }
        glPopMatrix();
    } 
}

void Asteroid::mover(int height, int width){
 
    if ( this->getAngulo() < 0 ){
        this->setAngulo(this->getAngulo() + (360.0));
    }

    this->setX(this->getX() + this->getVelocidade() * getCosAnguloGraus());
    this->setY(this->getY() + this->getVelocidade() * getSinAnguloGraus());

    if (this->getX() > (width)){
        this->setX(-width);
    }
    if (this->getX() < -(width) ){
        this->setX(width);
    }
    
    if (this->getY() > (height - 0.3) ){
        this->setY(-height + 0.3);
    }
    if (this->getY() < -(height + 0.3) ){
        this->setY(height - 0.3);
    }
 
}
    
